/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-08-28
 * Time: 21:39
 */
class Solution {
    //153.寻找旋转排序数组的最小值
    /*已知一个长度为 n 的数组，预先按照升序排列，经由 1 到 n 次 旋转 后，得到输入数组。
    例如，原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到：
    若旋转 4 次，则可以得到 [4,5,6,7,0,1,2]
    若旋转 7 次，则可以得到 [0,1,2,4,5,6,7]
    注意，数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
    给你一个元素值 互不相同 的数组 nums ，它原来是一个升序排列的数组，并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
    你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
    示例 1：
    输入：nums = [3,4,5,1,2]
    输出：1
    解释：原数组为 [1,2,3,4,5] ，旋转 3 次得到输入数组。
    示例 2：
    输入：nums = [4,5,6,7,0,1,2]
    输出：0
    解释：原数组为 [0,1,2,4,5,6,7] ，旋转 4 次得到输入数组。
    示例 3：
    输入：nums = [11,13,15,17]
    输出：11
    解释：原数组为 [11,13,15,17] ，旋转 4 次得到输入数组。
    提示：
    n == nums.length
1 <= n <= 5000
            -5000 <= nums[i] <= 5000
    nums 中的所有整数 互不相同
    nums 原来是一个升序排序的数组，并进行了 1 至 n 次旋转*/
    public int findMin(int[] nums) {
        //本质是求递增的最右端点
        int left=0,right=nums.length-1;
        //先判断是否旋转，没有旋转的话，第一个就是最小元素
        if(nums[left]<=nums[right]) return nums[0];
        while(left<right){
            int mid=left+(right-left+1)/2;
            //分层递增时求最右端的右边要小于左边的最小值，而非右边最大值
            if(nums[mid]<nums[0]) right=mid-1;
            else left=mid;
        }
        return nums[left+1];
    }

    public static void main(String[] args) {
        System.out.println(new Solution().findMin(new int[]{4,5,6,7,0,1,2}));
    }
}
